package com.sxj.corejava.code09_集合.List;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/**
 * @author 石小俊
 * @date 2025年02月19日
 */
public class Test04_遍历方式 {

    public static void main(String[] args) {
//        test01();
//        test02();
        test03();
    }

    public static void test01() {
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 4, 5, 7, 9, 12));
        System.out.println(list);

        // 普通for循环
        for (int i = 0; i < list.size(); i++) {
            Integer num = list.get(i);
            System.out.print(num + " ");
        }
        System.out.println("\n删除前:" + list);
        // 删除下标为偶数的元素
        for (int i = 0; i < list.size(); i++) {
            if (i % 2 == 0) {
                // 当移除了指定元素之后,该元素后面的元素的索引会随之改变
                // 1 2 4 5 6 9 12
                // i=0->删除1
                // 2 4 5 6 9 12
                // 下次进入循环的索引为1,相当于跳过了元素2
                // list.remove(i);
            }
        }
        // 此时通过升序的普通for循环没有实现
        // 需要考虑到删除元素后对索引的影响
        // 由于删除元素后索引的变化是从后向前改变了
        // 因此,可以考虑降序遍历
        for (int i = list.size() - 1; i >= 0; i--) {
            if (i % 2 == 0) {
                list.remove(i);
            }
        }
        System.out.println("删除后:" + list);
    }

    public static void test02() {
        // 增强for循环,即:foreach循环
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 4, 5, 7, 9, 12));
        System.out.println(list);
        for (Integer num : list) {
            System.out.print(num + "\t");
            // 在使用增强for循环时,不能添加或者删除元素
            // 即:集合的元素数量不能发生变化
//            list.add(3);
            list.remove(3);
//            list.set(0,4);
        }
        System.out.println("\n" + list);
    }

    public static void test03() {
        // iterator迭代器
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 4, 5, 7, 9, 12));
        System.out.println(list);
        // 创建Iterator迭代器,用于将集合中的元素进行遍历操作
        Iterator<Integer> it = list.iterator();
        // 通过hasNext方法判断当前迭代器中是否存在下一个元素
        // 返回值是布尔类型
        while (it.hasNext()) {
            // 如果存在,取出下一个元素
            Integer num = it.next();
            System.out.print(num + "\t");
//            list.add(2);
//            list.remove(2);
            // 删除偶数元素
            if (num % 2 == 0) {
                // 通过迭代器来移除
                it.remove();
            }
        }
        System.out.println("\n" + list);
    }

}
